home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Workbench Add-On
/
Workbench Add-On - Volume 1.iso
/
Music
/
MISC
/
DTMF
/
DTMF.asm
< prev
next >
Wrap
Assembly Source File
|
1995-08-23
|
9KB
|
562 lines
; DTMF Dialer
; (c) 1995 Martin Mares, MJSoft System Software
;DEBUG set 1
_GlobVec set 1
include "ssmac.h"
include "val/mui.equ"
MUITags equ $80420000
start
dv.l ratems
moveq #100,d2
get.l rate,d0
beq.s DefRate
move.l d0,a0
move.l (a0),d2
moveq #10,d0
cmp.l d0,d2
bcs.s BadRate
cmp.l #5000,d2
bcs.s DefRate
BadRate dtl <Invalid rate>,a0
jump ExitError
DefRate put.l d2,ratems
get.l number,d0
beq.s TryFile
move.l d0,a4
bra Dial
TryFile get.l file,d0
beq.s UseGUI
move.l d0,a0
moveq #OPEN_OLD,d0
moveq #0,d1
call TrackOpenBuf
move.l d0,a2
clr.l -(sp)
File1 call ss,BGetByte
tst.l d0
bmi.s ret1
move.b d0,(sp)
move.l sp,a4
push a2
lea Dial(pc),a0
moveq #0,d0
call CallBlock
pop a2
tst.l d0
beq.s File1
ret1 addq.l #4,sp
rts
UseGUI dtl <muimaster.library>,a0
moveq #MUIMASTER_VMIN,d0
call TrackLibrary
put.l d0,muimasterbase
dv.l muimasterbase
bsetv #svfb_errorreq,sv_flags+3
moveq #32,d7 ; Button array
clr.l -(sp)
dv.l buttxt
moveq #0,d4
GenButt subq.w #2,d7
bmi.s GBE
lea names(pc,d7.w),a0
put.l a0,buttxt
lea Button(pc),a3
bsr GenerateMUI
push d0
pea MUIA_Group_Child
bra.s GenButt
names dc.b '1',0,'2',0,'3',0,'A',0,'4',0,'5',0,'6',0,'B',0,'7',0,'8',0
dc.b '9',0,'C',0,'*',0,'0',0,'#',0,'D',0,0
even
GBE pea 4.w ; Matrix
pea MUIA_Group_Columns
pea -1.w
pea MUIA_Group_SameSize
move.l sp,a1
; dt STR_Group,<Group.mui>
gett STR_Group,a0
call muimaster,MUI_NewObject
put.l d0,matrix
dv.l matrix
bsr TrackMUI ; Main window etc
lea UserInterface(pc),a3
bsr GenerateMUI
lea 16(sp),sp ; !!!
moveq #100,d2 ; Button notifications
SetGBNot pop d0
beq.s SetGBNE
pop a2
push d2
pea MUIM_Application_ReturnID
pea 2.w
vpush appl
clr.l -(sp)
pea MUIA_Pressed
pea MUIM_Notify
move.l sp,a1
bsr DoMethod
lea 28(sp),sp
addq.w #1,d2
bra.s SetGBNot
SetGBNE move.w #MUIA_Window_Open-MUITags,d0
moveq #1,d1
get.l window,a0
bsr SetAttr
move.w #MUIA_Window_Open-MUITags,d0
get.l window,a0
bsr GetAttr
tst.l d0
errc.ne <Unable to open window>
lea Notifications(pc),a3
bsr SetRCs
bsr ActivateString
MainLoop clr.l -(sp)
move.l sp,d7
clr.l -(sp)
push d7
pea MUIM_Application_Input
get.l appl,a2
move.l sp,a1
bsr DoMethod
move.l d7,sp
pop d2
moveq #-1,d1
cmp.l d1,d0
beq.s MainEnd
moveq #(LastCode-Codes)/2,d1
cmp.l d1,d0
bcc.s MayBeButt
push d2
add.w d0,d0
move.w Codes(pc,d0.w),d0
jsr Codes(pc,d0.w)
pop d2
Waiting move.l d2,d0
beq.s MainLoop
call exec,Wait
bra.s MainLoop
MayBeButt moveq #100,d1
sub.l d1,d0
bcs.s Waiting
moveq #16,d1
cmp.l d1,d0
bcc.s Waiting
bsr.s DoButton
bra.s Waiting
Codes dc.w Return-Codes ; Do Nothing
dc.w MainEnd-Codes ; Close Gadget
dc.w StringAccept-Codes
LastCode
MainEnd jump ss,ExitCleanup
Return rts
DoButton push d2
lea names(pc),a4
add.w d0,a4
add.w d0,a4
bsr.s DoDialing
pop d2
rts
StringAccept move.w #MUIA_String_Acknowledge-MUITags,d0
get.l strg,a0
bsr GetAttr
move.l d0,a4
bsr.s DoDialing
ActivateString move.w #MUIA_Window_ActiveObject-MUITags,d0
get.l strg,d1
get.l window,a0
bra SetAttr
DoDialing move.w #MUIA_Application_Sleep-MUITags,d0
moveq #1,d1
get.l appl,a0
bsr SetAttr
lea Dial(pc),a0
moveq #0,d0
call ss,CallBlock
move.w #MUIA_Application_Sleep-MUITags,d0
moveq #0,d1
get.l appl,a0
bra SetAttr
DoMethod move.l -4(a2),a0
move.l 8(a0),a6
jmp (a6)
TrackMUI lea FreeObj(pc),a0
sub.l a1,a1
call ss,TrackRoutine
move.l a1,d4
rts
GenerateMUI move.l #MUITags,d2
gett __BaseText,a2
get.l muimasterbase,a6
bra.s .loopnext
.loop push d2
.loop2 move.w (a3)+,d2
beq.s .end
.loopnext moveq #0,d3
move.w (a3)+,d3
bmi.s .subobj
bclr #14,d3
bne.s .numb
add.l a2,d3 ; String
push d3
bra.s .loop
.numb cmp.w #$2000,d3 ; Number
beq.s .long
bcs.s .plus
or.l #$FFFFE000,d3
.plus push d3
bra.s .loop
.long push (a3)+
bra.s .loop
.subobj bclr #15,d3
bclr #14,d3
bne.s .var
add.l a2,d3
link a4,#0
push d3
move.w (a3)+,-(sp)
push d2
clr.l -(sp)
bra.s .loop2
.var move.l (a5,d3.w),-(sp)
bra.s .loop
.end move.l -4(a4),a0
move.l sp,a1
call MUI_NewObject
move.w -6(a4),d3
move.l d0,(a5,d3.w)
move.l -10(a4),d2
unlk a4
tst.w d2
beq.s .finish
push d0
bra.s .loop
.finish dtl <Unable to create user interface>,a0
tst.l d0
beq.s ExitErr
tst.l d4
beq.s 1$
move.l d4,a0
move.l d0,(a0)
1$ rts
ExitErr jump ss,ExitError
FreeObj jump muimaster,MUI_DisposeObject
SetRCs move.l sp,d3
pea 1.w ; 24
pea MUIM_Application_ReturnID ; 20
pea 2.w ; 16
vpush appl ; 12
clr.l -(sp) ; 8
pea MUITags ; 4
pea MUIM_Notify ; 0
1$ move.w (a3)+,d0
beq.s 2$
move.l (a5,d0.w),a2
move.w (a3)+,6(sp)
move.w (a3)+,d0
cmp.w #$8000,d0
bne.s 3$
move.l #MUIV_EveryTime,d0
bra.s 4$
3$ ext.l d0
4$ move.l d0,8(sp)
move.l sp,a1
bsr DoMethod
addq.l #1,24(sp)
bra.s 1$
2$ move.l d3,sp
rts
SetAttr clr.l -(sp)
push d1
move.w d0,-(sp)
move.w #MUITags>>16,-(sp)
move.l sp,a1
call intuition,SetAttrsA
lea 12(sp),sp
rts
GetAttr move.l #MUITags,d1
move.w d0,d1
move.l d1,d0
clr.l -(sp)
move.l sp,a1
call intuition,GetAttr
pop d0
rts
MTag macro
dc.w \1-MUITags
endm
MOffs macro
dc.w \1+\2-__BaseText
endm
MObj macro
ifne \1
MTag \1
endc
ifnd STREX_\2
STREX_\2 set 1
dt STR_\2,<\2.mui>
endc
MOffs $8000,STR_\2
ifgt NARG-2
dc.w \3
dv.l \3
elseif
dc.w __Trash
endc
endm
MText macro
MTag \1
dt STR_\@a,<\2>
MOffs 0,STR_\@a
endm
MNum macro
MTag \1
ifge \2-$2000
dc.w $6000
dc.l \2
elseif
ifle \2+$2000
dc.w $6000
dc.l \2
elseif
dc.w $4000+(\2&$3FFF)
endc
endc
endm
MVar macro
MTag \1
ifge \2-$4000
fail
endc
dc.w \2+$C000
endm
MEnd macro
dc.w 0
endm
Notify macro
dc.w \1,MUIA_\2-MUITags,\3
endm
NAny macro
dc.w \1,MUIA_\2-MUITags,$8000
endm
dv.l __Trash
dt.c __BaseText,<>
UserInterface
MObj 0,Application,appl
MText MUIA_Application_Title,<DTMF>
MText MUIA_Application_Version,<$VER: DTMF 1.2 (10.2.95)>
MText MUIA_Application_Copyright,<© 1995 MJSoft System Software>
MText MUIA_Application_Author,<Martin Mares>
MText MUIA_Application_Description,<Tone Dialer>
MText MUIA_Application_Base,<DTMF>
;;; MNum MUIA_Application_SingleTask,TRUE
MObj MUIA_Application_Window,Window,window
MText MUIA_Window_Title,<DTMF Dialer 1.2>
MObj MUIA_Window_RootObject,Group
MVar MUIA_Group_Child,matrix
MObj MUIA_Group_Child,String,strg
MText MUIA_String_Accept,<0123456789*#aAbBcCdD ,-.>
MNum MUIA_Frame,MUIV_FrameString
MEnd
MEnd
MEnd
MEnd
Button
MObj 0,Text
MNum MUIA_Frame,MUIV_FrameButton
MVar MUIA_Text_Contents,buttxt
MText MUIA_Text_PreParse,<',27,'c>
MNum MUIA_InputMode,MUIV_InputModeRelVerify
MNum MUIA_Background,MUII_ButtonBack
MEnd
Notifications Notify window,Window_CloseRequest,TRUE ; 1
NAny strg,String_Acknowledge ; 2
MEnd
; ### DIALING ROUTINES ###
dbuf ior1,ioa_SIZEOF
dbuf ior2,ioa_SIZEOF
dbuf ior3,ioa_SIZEOF
Dial geta ior1,a0
move.w #(ior2-ior1)/2-1,d0
1$ clr.w (a0)+
dbf d0,1$
call ss,TrackPort
move.l d0,d4
dtl <audio.device>,a0
geta ior1,a1
move.l d4,MN_REPLYPORT(a1)
moveq #0,d0
moveq #0,d1
sub.l a2,a2
call TrackDevice
move.l d1,a1
geta ior1,a2
lea combin(pc),a0
move.l a0,ioa_Data(a2)
addq.b #1,3+ioa_Length(a2)
move.w #ADCMD_ALLOCATE,IO_COMMAND(a2)
move.b #127,LN_PRI(a2)
dtl <Unable to allocate audio channels>,a0
call ChkDoIO
move.l IO_DEVICE(a2),d1
move.w ioa_AllocKey(a2),d3
moveq #1,d2
move.l d2,IO_UNIT(a2)
geta ior2,a0
moveq #8,d2
movem.l d1-d2,IO_DEVICE(a0)
move.w d3,ioa_AllocKey(a0)
move.l d4,MN_REPLYPORT(a0)
geta ior3,a0
move.l d1,IO_DEVICE(a0)
get.l ratems,d2
num0 call ss,TestBreak
move.b (a4)+,d0
beq.s done1
call utility,ToUpper
lea recode(pc),a0
moveq #15,d3
num1 cmp.b (a0)+,d0
dbeq d3,num1
bne.s numspac
bsr.s OneTone
bra.s num0
numspac bsr.s OneSpace
bra.s num0
done1 rts
recode dc.b 'D#0*C987B654A321'
; D3=Code, D2=Duration (ms)
OneTone geta ior3,a1
move.w #CMD_STOP,IO_COMMAND(a1)
call exec,SendIO
divu #4,d3
geta ior1,a1
lea freqshi(pc),a0
bsr.s SetIO
swap d3
geta ior2,a1
lea freqslo(pc),a0
bsr.s SetIO
geta ior3,a1
move.w #CMD_START,IO_COMMAND(a1)
call exec,SendIO
geta ior1,a1
call WaitIO
geta ior2,a1
call WaitIO
OneSpace move.l d2,d1
divu #20,d1
swap d1
clr.w d1
swap d1
jump dos,Delay
SetIO move.w #CMD_WRITE,IO_COMMAND(a1)
move.b #ADIOF_PERVOL,IO_FLAGS(a1)
lsl.w #2,d3
add.w d3,a0
move.w (a0)+,ioa_Period(a1)
moveq #0,d0
move.w (a0)+,d0
move.l d2,d1
call utility,UMult32
move.l #1000,d1
call UDivMod32
move.w d0,ioa_Cycles(a1)
lea sine,a0
move.l a0,ioa_Data(a1)
moveq #16,d0
move.l d0,ioa_Length(a1)
move.w #64,ioa_Volume(a1)
move.l IO_DEVICE(a1),a6
jmp DEV_BEGINIO(a6)
freqslo dc.w 186,1205
dc.w 168,1333
dc.w 151,1477
dc.w 137,1633
freqshi dc.w 321,697
dc.w 291,770
dc.w 263,852
dc.w 238,941
section Sample,DATA_C
sine dc.b 0,49,90,117,127,117,90,49
dc.b 0,-49,-90,-117,-127,-117,-90,-49
silence dc.b 0,0
;sine dc.b $80,$80,$80,$80,$80,$80,$80,$80
; dc.b $7f,$7f,$7f,$7f,$7f,$7f,$7f,$7f
code
combin dc.b 9
even
tags
template <NUMBER,RATE/K/N,FILE/K>
dv.l number
dv.l rate
dv.l file
finish
end